import axios from 'axios';
import { isFunction } from '@/utils/is';

let pendingMap = new Map();
export const getPendingUrl = config => [config.method, config.url].join('&');

// 取消axios请求
export class AxiosCanceler {
    // 添加pending状态的接口
    addPending(config) {
        // 每次添加时，会将这个接口上一次还在pending状态的请求cancel掉
        this.removePending(config);
        const url = getPendingUrl(config);
        // 往map中存储的数据格式为：{'接口url': 接口取消的函数}
        config.cancelToken =
            config.cancelToken ||
            new axios.CancelToken((cancel) => {
                if (!pendingMap.has(url)) {
                    pendingMap.set(url, cancel);
                }
            });
    }
    // 移除pending状态的接口
    removePending(config) {
        // 通过url找到map中存储的接口，调用存储的取消函数将接口取消，并将其从map中移除
        const url = getPendingUrl(config);
        if (pendingMap.has(url)) {
            const cancel = pendingMap.get(url);
            cancel && cancel(url);
            pendingMap.delete(url);
        }
    }
    // 移除所有pending状态的接口
    removeAllPending() {
        pendingMap.forEach((cancel) => {
            cancel && isFunction(cancel) && cancel();
        });
        pendingMap.clear();
    }
    // 重置map
    reset() {
        pendingMap = new Map();
    }
}
